#include <iostream>

using namespace std;

int n, k, sum;
char matrix[10][10];
bool row_used[10], col_used[10];  // 自己的行、列标记

void dfs(int step,int start_row) {
    if (step == k) {  // 已成功放置 k 个棋子
        sum++;
        return;
    }

    for (int i = start_row; i < n; i++) { // 遍历每一行
        for (int j = 0; j < n; j++) {  // 遍历每一列
            if (matrix[i][j] == '#' && !row_used[i] && !col_used[j]) { // 当前格子要放棋子且行列未被占用
                // 标记行列
                row_used[i] = true;
                col_used[j] = true;

                // 增加棋子数量，递归
                dfs(step + 1,i);

                // 撤回标记
                row_used[i] = false;
                col_used[j] = false;
            }
        }
    }
}

int main() {
    while (cin >> n >> k, n != -1 && k != -1) { // 输入结束条件
        // 初始化标记数组
        for (int i = 0; i < n; i++) {
            row_used[i] = false;
            col_used[i] = false;
        }

        // 读取棋盘
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cin >> matrix[i][j];
            }
        }

        sum = 0;  // 方案计数
        dfs(0,0);   // 开始深度优先搜索
        cout << sum << endl;  // 输出结果
    }

    return 0;
}